package main

import (
	"fmt"
	"log"
	"time"

	modbus "z:/gocoding/src/modbus"
)

func main() {
	fmt.Println("=== 网关协议服务端演示 ===")

	// 创建TCP服务器
	server := modbus.NewTCPServer("127.0.0.1:5020", 5*time.Second)
	if server == nil {
		log.Fatal("创建服务器失败")
	}

	// 创建网关设备节点
	gatewayNode := modbus.NewNodeRegister(
		65,    // 网关地址 (65-247)
		0, 10, // 线圈
		0, 10, // 离散输入
		0, 10, // 输入寄存器
		0, 10, // 保持寄存器
	)

	// 初始化网关数据存储 (最多存储100条记录)
	gatewayNode.InitGatewayDataStore(100)

	// 创建变送器设备节点
	transmitterNode := modbus.NewNodeRegister(
		1,     // 变送器地址 (1-64)
		0, 10, // 线圈
		0, 10, // 离散输入
		0, 10, // 输入寄存器
		0, 10, // 保持寄存器
	)

	// 为变送器也初始化网关数据存储
	transmitterNode.InitGatewayDataStore(100)

	// 添加节点到服务器
	server.AddNodes(gatewayNode, transmitterNode)

	fmt.Printf("网关节点地址: %d\n", gatewayNode.SlaveID())
	fmt.Printf("变送器节点地址: %d\n", transmitterNode.SlaveID())

	// 启动服务器（非阻塞）
	err := server.ListenAndServe()
	if err != nil {
		log.Fatalf("启动服务器失败: %v", err)
	}

	fmt.Println("服务器已启动，监听地址: 127.0.0.1:5020")
	fmt.Println("支持的网关协议功能码:")
	fmt.Println("  0x50 - 读数据记录")
	fmt.Println("  0x51 - 读当前数据")
	fmt.Println("  0x52 - 写子设备参数")
	fmt.Println("  0x53 - 写网关参数")
	fmt.Println()

	// 模拟数据更新
	go simulateDataUpdates(gatewayNode, transmitterNode)

	// 保持服务器运行
	fmt.Println("按 Ctrl+C 停止服务器...")
	select {}
}

// simulateDataUpdates 模拟数据更新
func simulateDataUpdates(gatewayNode, transmitterNode *modbus.NodeRegister) {
	ticker := time.NewTicker(10 * time.Second)
	defer ticker.Stop()

	counter := 0
	for range ticker.C {
		counter++
		now := uint32(time.Now().Unix())

		// 为网关节点添加新的数据记录
		gatewayStore := gatewayNode.GetGatewayDataStore()
		if gatewayStore != nil {
			newRecord := &modbus.DataRecord{
				Pressure:         25.0 + float32(counter%10)*0.5,
				PressureUnit:     modbus.PressureUnitKPa,
				BatteryLevel:     uint8(85 + counter%15),
				ConnectionStatus: 1,
				SignalLevel:      uint8(3 + counter%3),
				Timestamp:        now,
			}
			gatewayStore.AddRecord(newRecord)
			gatewayStore.SetCurrentData(newRecord)

			fmt.Printf("网关数据更新 #%d: 压力=%.1f KPa, 电池=%d%%, 信号=%d级\n",
				counter, newRecord.Pressure, newRecord.BatteryLevel, newRecord.SignalLevel)
		}

		// 为变送器节点添加新的数据记录
		transmitterStore := transmitterNode.GetGatewayDataStore()
		if transmitterStore != nil {
			newRecord := &modbus.DataRecord{
				Pressure:         15.0 + float32(counter%5)*0.3,
				PressureUnit:     modbus.PressureUnitMbar,
				BatteryLevel:     uint8(90 + counter%10),
				ConnectionStatus: 1,
				SignalLevel:      uint8(4 + counter%2),
				Timestamp:        now,
			}
			transmitterStore.AddRecord(newRecord)
			transmitterStore.SetCurrentData(newRecord)

			fmt.Printf("变送器数据更新 #%d: 压力=%.1f mbar, 电池=%d%%, 信号=%d级\n",
				counter, newRecord.Pressure, newRecord.BatteryLevel, newRecord.SignalLevel)
		}
	}
}
